﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

// Возвращает реквизиты объекта, которые разрешается редактировать
// с помощью обработки группового изменения реквизитов.
//
// Возвращаемое значение:
//  Массив из Строка
//
Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт
	
	Результат = Новый Массив;
	Результат.Добавить("ИспользоватьДляОтправки");
	Результат.Добавить("ИспользоватьДляПолучения");
	Возврат Результат;
	
КонецФункции

// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	
	Ограничение.Текст =
	"РазрешитьЧтение
	|ГДЕ
	|	ВЫБОР КОГДА ВладелецУчетнойЗаписи = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) ТОГДА
	|		ЗначениеРазрешено(Ссылка)
	|	ИНАЧЕ
	|		ЗначениеРазрешено(Ссылка, Отключено КАК Ложь)
	|		ИЛИ ЗначениеРазрешено(ВладелецУчетнойЗаписи, Отключено КАК Ложь)
	|		ИЛИ ЭтоАвторизованныйПользователь(ВладелецУчетнойЗаписи)
	|	КОНЕЦ
	|;
	|РазрешитьИзменениеЕслиРазрешеноЧтение
	|ГДЕ
	|	ЗначениеРазрешено(ВладелецУчетнойЗаписи, ПустаяСсылка КАК Ложь)";
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#КонецОбласти

#КонецЕсли

#Область ОбработчикиСобытий

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Поля.Добавить("АдресЭлектроннойПочты");
	Поля.Добавить("Наименование");
	
КонецПроцедуры

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	Если ЗначениеЗаполнено(Данные.АдресЭлектроннойПочты) И СтрНайти(Данные.Наименование, Данные.АдресЭлектроннойПочты) = 0 Тогда
		Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (%2)'"), 
			Данные.Наименование, Данные.АдресЭлектроннойПочты);
	Иначе
		Представление = Данные.Наименование;
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныйПрограммныйИнтерфейс

// Регистрирует на плане обмена ОбновлениеИнформационнойБазы объекты,
// которые необходимо обновить на новую версию.
//
Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда
		МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия");
		МодульВзаимодействия.ЗарегистрироватьУчетныеЗаписиЭлектроннойПочтыКОбработкеДляПереходаНаНовуюВерсию(Параметры);
	КонецЕсли;
	
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	УчетныеЗаписиЭлектроннойПочты.Ссылка
	|ИЗ
	|	Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты
	|ГДЕ
	|	НЕ УчетныеЗаписиЭлектроннойПочты.ПриОтправкеПисемТребуетсяАвторизация
	|	И (УчетныеЗаписиЭлектроннойПочты.ПользовательSMTP <> """"
	|	ИЛИ УчетныеЗаписиЭлектроннойПочты.ТребуетсяВходНаСерверПередОтправкой)";
	
	Запрос = Новый Запрос(ТекстЗапроса);
	
	Результат = Запрос.Выполнить().Выгрузить();
	МассивСсылок = Результат.ВыгрузитьКолонку("Ссылка");
	
	ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, МассивСсылок);
	
КонецПроцедуры

Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	УчетныеЗаписи = Новый Массив;
	Выборка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.УчетныеЗаписиЭлектроннойПочты");
	Пока Выборка.Следующий() Цикл
		УчетныеЗаписи.Добавить(Выборка.Ссылка);
	КонецЦикла;
	
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты
	|ГДЕ
	|	УчетныеЗаписиЭлектроннойПочты.Ссылка В(&УчетныеЗаписи)";
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("УчетныеЗаписи", УчетныеЗаписи);
	
	Блокировка = Новый БлокировкаДанных;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда
		МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия");
		МодульВзаимодействия.ПередУстановкойБлокировкиВОбработчикеОбновленияУчетныхЗаписейЭлектроннойПочты(Блокировка);
	КонецЕсли;
	Блокировка.Добавить("Справочник.УчетныеЗаписиЭлектроннойПочты");
	
	НачатьТранзакцию();
	Попытка
		Блокировка.Заблокировать();
		
		ВладельцыУчетныхЗаписей = Новый Соответствие;
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда
			МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия");
			ВладельцыУчетныхЗаписей = МодульВзаимодействия.ВладельцыУчетныхЗаписейЭлектроннойПочты(УчетныеЗаписи);
		КонецЕсли;
		
		Выборка = Запрос.Выполнить().Выбрать();
		Пока Выборка.Следующий() Цикл
			УчетнаяЗапись = Выборка.Ссылка.ПолучитьОбъект();
			УчетнаяЗапись.ДополнительныеСвойства.Вставить("НеПроверятьИзменениеНастроек");
			Если ВладельцыУчетныхЗаписей[Выборка.Ссылка] <> Неопределено Тогда
				УчетнаяЗапись.ВладелецУчетнойЗаписи = ВладельцыУчетныхЗаписей[Выборка.Ссылка];
			КонецЕсли;
			Если Не УчетнаяЗапись.ПриОтправкеПисемТребуетсяАвторизация 
				И (УчетнаяЗапись.ПользовательSMTP <> ""
				Или УчетнаяЗапись.ТребуетсяВходНаСерверПередОтправкой) Тогда
				УчетнаяЗапись.ПриОтправкеПисемТребуетсяАвторизация = Истина;
				Если УчетнаяЗапись.ИспользоватьДляОтправки И УчетнаяЗапись.Пользователь <> УчетнаяЗапись.ПользовательSMTP Тогда
					УчетнаяЗапись.Пользователь = УчетнаяЗапись.ПользовательSMTP;
					УстановитьПривилегированныйРежим(Истина);
					Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(УчетнаяЗапись.Ссылка, "Пароль,ПарольSMTP");
					Если Пароли.Пароль <> Пароли.ПарольSMTP Тогда
						ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(УчетнаяЗапись.Ссылка, Пароли.ПарольSMTP);
					КонецЕсли;
					УстановитьПривилегированныйРежим(Ложь);
				КонецЕсли;
			КонецЕсли;
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда
				МодульВзаимодействия.ОчиститьПризнакПерсональнаяУчетнаяЗапись(УчетнаяЗапись.Ссылка);
			КонецЕсли;
			ОбновлениеИнформационнойБазы.ЗаписатьДанные(УчетнаяЗапись);
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление учетных записей'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение;
	КонецПопытки;
	
	Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.УчетныеЗаписиЭлектроннойПочты");
	
КонецПроцедуры

// Начальное заполнение

// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов
// 
// Параметры:
//  Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки
//
Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт
	
	Настройки.ПриНачальномЗаполненииЭлемента = Ложь;
	
КонецПроцедуры

// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов
// 
// Параметры:
//   КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков
//   Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы
//   ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти
//
Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт
	
	Элемент = Элементы.Добавить();
	Элемент.ИмяПредопределенныхДанных        = "СистемнаяУчетнаяЗаписьЭлектроннойПочты";
	Элемент.Наименование                     = НСтр("ru = 'Системная учетная запись'", 
		ОбщегоНазначения.КодОсновногоЯзыка());
	Элемент.ИмяПользователя                  = НСтр("ru = '1С:Предприятие'", ОбщегоНазначения.КодОсновногоЯзыка());
	Элемент.ИспользоватьДляПолучения         = Ложь;
	Элемент.ИспользоватьДляОтправки          = Ложь;
	Элемент.ОставлятьКопииСообщенийНаСервере = Ложь;
	Элемент.ПериодХраненияСообщенийНаСервере = 0;
	Элемент.ВремяОжидания                    = 30;
	Элемент.ПортСервераВходящейПочты         = 110;
	Элемент.ПортСервераИсходящейПочты        = 25;
	Элемент.ПротоколВходящейПочты            = "POP";
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	
	Если ВидФормы = "ФормаОбъекта" 
		И Не Параметры.Свойство("ЗначениеКопирования")
		И ПравоДоступа("Редактирование", Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты)
		И (Не Параметры.Свойство("Ключ") 
			Или Не РаботаСПочтовымиСообщениями.УчетнаяЗаписьНастроена(Параметры.Ключ, Ложь, Ложь) И ИзменениеРазрешено(Параметры.Ключ)) Тогда
		
		ВыбраннаяФорма = "ПомощникНастройкиУчетнойЗаписи";
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

Функция ИзменениеРазрешено(УчетнаяЗапись) Экспорт
	Результат = ПравоДоступа("Редактирование", Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты);
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		Результат = Результат И МодульУправлениеДоступом.ИзменениеРазрешено(УчетнаяЗапись);
	КонецЕсли;
	Возврат Результат;
КонецФункции

Функция РазрешенияУчетныхЗаписей(УчетнаяЗапись = Неопределено) Экспорт
	
	Результат = Новый Соответствие;
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты КАК Протокол,
	|	УчетныеЗаписиЭлектроннойПочты.СерверВходящейПочты КАК Сервер,
	|	УчетныеЗаписиЭлектроннойПочты.ПортСервераВходящейПочты КАК Порт,
	|	УчетныеЗаписиЭлектроннойПочты.Ссылка
	|ПОМЕСТИТЬ СервераЭлектроннойПочты
	|ИЗ
	|	Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты
	|ГДЕ
	|	УчетныеЗаписиЭлектроннойПочты.ПротоколВходящейПочты <> """"
	|	И УчетныеЗаписиЭлектроннойПочты.ПометкаУдаления = ЛОЖЬ
	|	И УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляПолучения = ИСТИНА
	|	И УчетныеЗаписиЭлектроннойПочты.СерверВходящейПочты <> """"
	|	И УчетныеЗаписиЭлектроннойПочты.ПортСервераВходящейПочты > 0
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	""SMTP"",
	|	УчетныеЗаписиЭлектроннойПочты.СерверИсходящейПочты,
	|	УчетныеЗаписиЭлектроннойПочты.ПортСервераИсходящейПочты,
	|	УчетныеЗаписиЭлектроннойПочты.Ссылка
	|ИЗ
	|	Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты
	|ГДЕ
	|	УчетныеЗаписиЭлектроннойПочты.ПометкаУдаления = ЛОЖЬ
	|	И УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляОтправки = ИСТИНА
	|	И УчетныеЗаписиЭлектроннойПочты.СерверИсходящейПочты <> """"
	|	И УчетныеЗаписиЭлектроннойПочты.ПортСервераИсходящейПочты > 0
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СервераЭлектроннойПочты.Ссылка КАК Ссылка,
	|	СервераЭлектроннойПочты.Протокол КАК Протокол,
	|	СервераЭлектроннойПочты.Сервер КАК Сервер,
	|	СервераЭлектроннойПочты.Порт КАК Порт
	|ИЗ
	|	СервераЭлектроннойПочты КАК СервераЭлектроннойПочты
	|ГДЕ
	|	&Ссылка = НЕОПРЕДЕЛЕНО
	|
	|СГРУППИРОВАТЬ ПО
	|	СервераЭлектроннойПочты.Протокол,
	|	СервераЭлектроннойПочты.Сервер,
	|	СервераЭлектроннойПочты.Порт,
	|	СервераЭлектроннойПочты.Ссылка
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	СервераЭлектроннойПочты.Ссылка,
	|	СервераЭлектроннойПочты.Протокол,
	|	СервераЭлектроннойПочты.Сервер,
	|	СервераЭлектроннойПочты.Порт
	|ИЗ
	|	СервераЭлектроннойПочты КАК СервераЭлектроннойПочты
	|ГДЕ
	|	СервераЭлектроннойПочты.Ссылка = &Ссылка
	|
	|СГРУППИРОВАТЬ ПО
	|	СервераЭлектроннойПочты.Протокол,
	|	СервераЭлектроннойПочты.Сервер,
	|	СервераЭлектроннойПочты.Порт,
	|	СервераЭлектроннойПочты.Ссылка
	|ИТОГИ ПО
	|	Ссылка";
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("Ссылка", УчетнаяЗапись);
	
	МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
	
	УчетныеЗаписи = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока УчетныеЗаписи.Следующий() Цикл
		Разрешения = Новый Массив;
		НастройкиУчетнойЗаписи = УчетныеЗаписи.Выбрать();
		Пока НастройкиУчетнойЗаписи.Следующий() Цикл
			Разрешения.Добавить(
				МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
					НастройкиУчетнойЗаписи.Протокол,
					НастройкиУчетнойЗаписи.Сервер,
					НастройкиУчетнойЗаписи.Порт,
					НСтр("ru = 'Электронная почта.'")));
		КонецЦикла;
		Результат.Вставить(УчетныеЗаписи.Ссылка, Разрешения);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ОпределитьИменаПочтовыхСерверовДомена(Домен)
	
	Результат = Новый Массив;
	
	ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы();
	ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
	ПараметрыЗапускаПрограммы.ПолучитьПотокВывода = Истина;
	ПараметрыЗапускаПрограммы.ПолучитьПотокОшибок = Истина;
	ПараметрыЗапускаПрограммы.КодировкаИсполнения = "OEM";
	
	АдресаСерверовDNS = РаботаСПочтовымиСообщениямиСлужебный.АдресаСерверовDNS();
	АдресаСерверовDNS.Вставить(0, ""); // Сервер по умолчанию.
	
	СтрокиКоманд = Новый Массив;
	
	Для Каждого АдресСервера Из АдресаСерверовDNS Цикл
		ШаблонКоманды = "nslookup -type=mx %1 %2";
		СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКоманды, Домен, АдресСервера);
		СтрокиКоманд.Добавить(СтрокаКоманды);
		
		РезультатЗапуска = ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыЗапускаПрограммы);
		Если РезультатЗапуска.КодВозврата = 0 Тогда
			Ответ = РезультатЗапуска.ПотокВывода + Символы.ПС + РезультатЗапуска.ПотокОшибок;
			
			Для Каждого Строка Из СтрРазделить(Ответ, Символы.ПС, Ложь) Цикл
				Если СтрНайти(Строка, "mail exchanger") > 0 Тогда
					ЧастиСтроки = СтрРазделить(Строка, " ", Ложь);
					ИмяСервера  = ЧастиСтроки[ЧастиСтроки.ВГраница()];
					ИмяСервера  = СтрСоединить(СтрРазделить(ИмяСервера, ".", Ложь), ".");
					Результат.Добавить(ИмяСервера);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Результат) Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ОпределитьНастройкиУчетнойЗаписи(Знач АдресЭлектроннойПочты, Пароль, ДляОтправки, ДляПолучения) Экспорт
	
	АдресЭлектроннойПочты = РаботаСПочтовымиСообщениямиСлужебный.СтрокаВPunycode(АдресЭлектроннойПочты);
	УстановитьПривилегированныйРежим(Истина);
	НайденныеНастройки = НастройкиПодключенияПоАдресуЭлектроннойПочты(АдресЭлектроннойПочты, Пароль);
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат ПодобратьНастройкиПочты(АдресЭлектроннойПочты, Пароль, ДляОтправки, ДляПолучения, НайденныеНастройки.Профиль);
	
КонецФункции

// Возвращаемое значение:
//  Структура:
//   * Профиль - ИнтернетПочтовыйПрофиль
//   * ИмяПочтовогоСервера - Строка
//   * НастройкиАвторизации - см. Справочники.НастройкиАвторизацииИнтернетСервисов.НастройкиАвторизацииИнтернетСервиса
//
Функция НастройкиПодключенияПоАдресуЭлектроннойПочты(АдресЭлектроннойПочты, Пароль = "") Экспорт
	
	СтруктураАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресЭлектроннойПочты);
	ПочтовыйДомен = СтруктураАдреса.Хост;
	
	НайденныеНастройки = Неопределено;
	ИмяПочтовогоСервера = "";
	
	НастройкиПочтовыхСерверов = НастройкиПочтовыхСерверов();
	Если НастройкиПочтовыхСерверов <> Неопределено Тогда
		НайденныеНастройки = НастройкиПочтовыхСерверов[СтруктураАдреса.Хост];
		ИмяПочтовогоСервера = СтруктураАдреса.Хост;
		Если ТипЗнч(НайденныеНастройки) = Тип("Строка") Тогда
			ИмяПочтовогоСервера = НайденныеНастройки;
			НайденныеНастройки = НастройкиПочтовыхСерверов[НайденныеНастройки];
		КонецЕсли;

		Если НайденныеНастройки = Неопределено Тогда
			ИменаСерверов = ОпределитьИменаПочтовыхСерверовДомена(СтруктураАдреса.Хост);
			Для Каждого ИмяСервера Из ИменаСерверов Цикл
				УровниДомена = СтрРазделить(ИмяСервера, ".", Ложь);
				Пока УровниДомена.Количество() > 1 Цикл
					Хост = СтрСоединить(УровниДомена, ".");
				
					НайденныеНастройки = НастройкиПочтовыхСерверов[Хост];
					ИмяПочтовогоСервера = Хост;
					
					Если ТипЗнч(НайденныеНастройки) = Тип("Строка") Тогда
						ИмяПочтовогоСервера = НайденныеНастройки;
						НайденныеНастройки = НастройкиПочтовыхСерверов[НайденныеНастройки];
					КонецЕсли;
					
					Если ТипЗнч(НайденныеНастройки) = Тип("Соответствие") Тогда
						Прервать;
					Иначе
						НайденныеНастройки = Неопределено;
					КонецЕсли;
					
					УровниДомена.Удалить(0);
				КонецЦикла;
				
				Если ТипЗнч(НайденныеНастройки) = Тип("Соответствие") Тогда
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
	Если НайденныеНастройки = Неопределено Тогда
		НайденныеНастройки = Новый Соответствие;
	КонецЕсли;
	
	Профиль = Неопределено;
	Если ЗначениеЗаполнено(НайденныеНастройки) Тогда
		Профиль = СформироватьПрофиль(НайденныеНастройки, АдресЭлектроннойПочты, Пароль);
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	НастройкиАвторизации = НастройкиАвторизацииСервера(НайденныеНастройки, ИмяПочтовогоСервера, ПочтовыйДомен);
	УстановитьПривилегированныйРежим(Ложь);
	
	Результат = Новый Структура;
	Результат.Вставить("Профиль", Профиль);
	Результат.Вставить("ИмяПочтовогоСервера", ИмяПочтовогоСервера);
	Результат.Вставить("НастройкиАвторизации", НастройкиАвторизации);
	
	Возврат Результат;
	
КонецФункции

// Возвращаемое значение:
//   см. Справочники.НастройкиАвторизацииИнтернетСервисов.НастройкиАвторизацииИнтернетСервиса
//
Функция НастройкиАвторизацииСервера(НайденныеНастройки, ИмяПочтовогоСервера, ПочтовыйДомен)
	
	НастройкиАвторизации = Справочники.НастройкиАвторизацииИнтернетСервисов.НастройкиАвторизацииИнтернетСервиса(ИмяПочтовогоСервера, ПочтовыйДомен);
	НастройкиИзКлассификатора = НайденныеНастройки["OAuth"];
	
	Если Не ЗначениеЗаполнено(НастройкиИзКлассификатора) Тогда
		Возврат НастройкиАвторизации;
	КонецЕсли;
	
	НастройкиАвторизации.ИмяИнтернетСервиса = ИмяПочтовогоСервера;
	НастройкиАвторизации.ВладелецДанных = ПочтовыйДомен;
	
	Если Не ЗначениеЗаполнено(НастройкиАвторизации.АдресАвторизации) Тогда
		НастройкиАвторизации.АдресАвторизации = НастройкиИзКлассификатора["AuthorizationURI"];
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(НастройкиАвторизации.АдресПолученияКлюча) Тогда
		НастройкиАвторизации.АдресПолученияКлюча = НастройкиИзКлассификатора["TokenExchangeURI"];
	КонецЕсли;
	
	НастройкиАвторизации.ЗапрашиваемыеРазрешения = НастройкиИзКлассификатора["MailScope"];
	Если ТипЗнч(НастройкиАвторизации.ЗапрашиваемыеРазрешения) = Тип("Массив") Тогда
		НастройкиАвторизации.ЗапрашиваемыеРазрешения = СтрСоединить(НастройкиАвторизации.ЗапрашиваемыеРазрешения, " ");
	КонецЕсли;
	
	НастройкиАвторизации.ИспользоватьКлючПроверкиПодлинностиPKCE = НастройкиИзКлассификатора["UsePKCE"];
	НастройкиАвторизации.ИспользоватьПарольПриложения = НастройкиИзКлассификатора["UseClientSecret"];
	
	ДополнительныеПараметрыАвторизации = НастройкиИзКлассификатора["AuthorizationParameters"];
	Если ЗначениеЗаполнено(ДополнительныеПараметрыАвторизации) Тогда
		ОписанияПараметров = Новый Массив;
		Для Каждого Элемент Из ДополнительныеПараметрыАвторизации Цикл
			ОписанияПараметров.Добавить(Элемент.Ключ + "=" + XMLСтрока(Элемент.Значение));
		КонецЦикла;
		НастройкиАвторизации.ДополнительныеПараметрыАвторизации = СтрСоединить(ОписанияПараметров, " ");
	КонецЕсли;
	
	ДополнительныеПараметрыПолученияТокена = НастройкиИзКлассификатора["TokenExchangeParameters"];
	Если ЗначениеЗаполнено(ДополнительныеПараметрыПолученияТокена) Тогда
		ОписанияПараметров = Новый Массив;
		Для Каждого Элемент Из ДополнительныеПараметрыПолученияТокена Цикл
			ОписанияПараметров.Добавить(Элемент.Ключ + "=" + XMLСтрока(Элемент.Значение));
		КонецЦикла;
		НастройкиАвторизации.ДополнительныеПараметрыПолученияТокена = СтрСоединить(ОписанияПараметров, " ");
	КонецЕсли;
	
	НастройкиАвторизации.ПояснениеПоАдресуПеренаправления = СтроковыеФункции.ФорматированнаяСтрока(
		СтрокаДляТекущегоЯзыка(НастройкиИзКлассификатора["RedirectURIDescription"]));
		
	НастройкиАвторизации.ПояснениеПоИдентификаторуПриложения = СтроковыеФункции.ФорматированнаяСтрока(
		СтрокаДляТекущегоЯзыка(НастройкиИзКлассификатора["ClientIDDescription"]));
		
	НастройкиАвторизации.ПояснениеПоПаролюПриложения = СтроковыеФункции.ФорматированнаяСтрока(
		СтрокаДляТекущегоЯзыка(НастройкиИзКлассификатора["ClientSecretDescription"]));
	
	НастройкиАвторизации.ДополнительноеПояснение = СтроковыеФункции.ФорматированнаяСтрока(
		СтрокаДляТекущегоЯзыка(НастройкиИзКлассификатора["AdditionalDescription"]));
	
	НастройкиАвторизации.ПсевдонимАдресаПеренаправления = СтрокаДляТекущегоЯзыка(НастройкиИзКлассификатора["RedirectURICaption"]);
	НастройкиАвторизации.ПсевдонимИдентификатораПриложения = СтрокаДляТекущегоЯзыка(НастройкиИзКлассификатора["ClientIDCaption"]);
	НастройкиАвторизации.ПсевдонимПароляПриложения = СтрокаДляТекущегоЯзыка(НастройкиИзКлассификатора["ClientSecretCaption"]);
	
	НастройкиАвторизации.АдресПеренаправленияПоУмолчанию = НастройкиИзКлассификатора["DefaultRedirectURI"];
	НастройкиАвторизации.АдресПеренаправленияВебКлиент = НастройкиИзКлассификатора["WebClientRedirectURI"];
	
	НастройкиАвторизации.АдресРегистрацииУстройства = НастройкиИзКлассификатора["DeviceAuthorizationURI"];
	
	Возврат НастройкиАвторизации;
	
КонецФункции

Функция СтрокаДляТекущегоЯзыка(МультиязычнаяСтрока)
	
	Если ТипЗнч(МультиязычнаяСтрока) <> Тип("Соответствие") Тогда
		Возврат МультиязычнаяСтрока;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(МультиязычнаяСтрока) Тогда
		Возврат "";
	КонецЕсли;
	
	КодыЯзыков = Новый Структура;
	КодыЯзыков.Вставить(ТекущийЯзык().КодЯзыка);
	КодыЯзыков.Вставить(ОбщегоНазначения.КодОсновногоЯзыка());
	КодыЯзыков.Вставить("en");
	
	Для Каждого Элемент Из КодыЯзыков Цикл
		КодЯзыка = Элемент.Ключ;
		Если ЗначениеЗаполнено(МультиязычнаяСтрока[КодЯзыка]) Тогда
			Возврат МультиязычнаяСтрока[КодЯзыка];
		КонецЕсли;
	КонецЦикла;
	
	Возврат "";
	
КонецФункции

Функция НастройкиПочтовыхСерверов()
	
	НастройкиПочтовыхСерверов = Неопределено;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
		МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
		
		АдресФайлаСНастройками = РаботаСПочтовымиСообщениямиСлужебный.АдресФайлаСНастройками();
		ЗагруженныйФайл = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресФайлаСНастройками);
		
		Если ЗагруженныйФайл.Статус Тогда
			ЧтениеJSON = Новый ЧтениеJSON();
			ЧтениеJSON.ОткрытьФайл(ЗагруженныйФайл.Путь);
			НастройкиПочтовыхСерверов = ПрочитатьJSON(ЧтениеJSON, Истина);
			ЧтениеJSON.Закрыть();
		КонецЕсли;
	КонецЕсли;
	
	Возврат НастройкиПочтовыхСерверов;
	
КонецФункции

Функция ПодобратьНастройкиПочты(АдресЭлектроннойПочты, Пароль, ДляОтправки, ДляПолучения, Профиль = Неопределено)
	
	НастройкиПолучены = Профиль <> Неопределено;
	
	НайденныйПрофильSMTP = ?(НастройкиПолучены И ЗначениеЗаполнено(Профиль.АдресСервераSMTP), Профиль, Неопределено);
	НайденныйПрофильIMAP = ?(НастройкиПолучены И ЗначениеЗаполнено(Профиль.АдресСервераIMAP), Профиль, Неопределено);
	НайденныйПрофильPOP = ?(НастройкиПолучены И НайденныйПрофильIMAP = Неопределено И ЗначениеЗаполнено(Профиль.АдресСервераPOP3), Профиль, Неопределено);
	
	Если Не НастройкиПолучены Тогда
		Если ДляОтправки Тогда
			НайденныйПрофильSMTP = ОпределитьНастройкиSMTP(АдресЭлектроннойПочты, Пароль);
		КонецЕсли;
		
		Если ДляОтправки Или ДляПолучения Тогда
			НайденныйПрофильIMAP = ОпределитьНастройкиIMAP(АдресЭлектроннойПочты, Пароль);
			Если НайденныйПрофильIMAP = Неопределено И ДляПолучения Тогда
				НайденныйПрофильPOP = ОпределитьНастройкиPOP(АдресЭлектроннойПочты, Пароль);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Результат = Новый Структура;
	
	Если НайденныйПрофильIMAP <> Неопределено Тогда
		Результат.Вставить("ИмяПользователяДляПолученияПисем", НайденныйПрофильIMAP.ПользовательIMAP);
		Результат.Вставить("ПарольДляПолученияПисем", НайденныйПрофильIMAP.ПарольIMAP);
		Результат.Вставить("Протокол", "IMAP");
		Результат.Вставить("СерверВходящейПочты", НайденныйПрофильIMAP.АдресСервераIMAP);
		Результат.Вставить("ПортСервераВходящейПочты", НайденныйПрофильIMAP.ПортIMAP);
		Результат.Вставить("ИспользоватьЗащищенноеСоединениеДляВходящейПочты", НайденныйПрофильIMAP.ИспользоватьSSLIMAP);
	КонецЕсли;
	
	Если НайденныйПрофильPOP <> Неопределено Тогда
		Результат.Вставить("ИмяПользователяДляПолученияПисем", НайденныйПрофильPOP.Пользователь);
		Результат.Вставить("ПарольДляПолученияПисем", НайденныйПрофильPOP.Пароль);
		Результат.Вставить("Протокол", "POP");
		Результат.Вставить("СерверВходящейПочты", НайденныйПрофильPOP.АдресСервераPOP3);
		Результат.Вставить("ПортСервераВходящейПочты", НайденныйПрофильPOP.ПортPOP3);
		Результат.Вставить("ИспользоватьЗащищенноеСоединениеДляВходящейПочты", НайденныйПрофильPOP.ИспользоватьSSLPOP3);
	КонецЕсли;
	
	Если НайденныйПрофильSMTP <> Неопределено Тогда
		Результат.Вставить("ИмяПользователяДляОтправкиПисем", НайденныйПрофильSMTP.ПользовательSMTP);
		Результат.Вставить("ПарольДляОтправкиПисем", НайденныйПрофильSMTP.ПарольSMTP);
		Результат.Вставить("СерверИсходящейПочты", НайденныйПрофильSMTP.АдресСервераSMTP);
		Результат.Вставить("ПортСервераИсходящейПочты", НайденныйПрофильSMTP.ПортSMTP);
		Результат.Вставить("ИспользоватьЗащищенноеСоединениеДляИсходящейПочты", НайденныйПрофильSMTP.ИспользоватьSSLSMTP);
	КонецЕсли;
	
	Результат.Вставить("ДляПолучения", НайденныйПрофильIMAP <> Неопределено Или НайденныйПрофильPOP <> Неопределено);
	Результат.Вставить("ДляОтправки", НайденныйПрофильSMTP <> Неопределено);
	Результат.Вставить("ПроверкаНастроекВыполнена", Не НастройкиПолучены);
	
	Возврат Результат;
	
КонецФункции

Функция СформироватьПрофиль(ИзвестныеНастройки, АдресЭлектроннойПочты, Пароль = "")
	
	СтруктураАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресЭлектроннойПочты);
	
	Профиль = Новый ИнтернетПочтовыйПрофиль;
	Для Каждого Подключение Из ИзвестныеНастройки["Services"] Цикл
		Если Подключение["Protocol"] = "SMTP" И Не ЗначениеЗаполнено(Профиль.АдресСервераSMTP) Тогда
			Если Подключение["SMTPAuthentication"] = "Enabled" Или Подключение["SMTPAuthentication"] = Неопределено Тогда
				Профиль.ПользовательSMTP = ?(Подключение["LoginFormat"] = "username", СтруктураАдреса.Логин, АдресЭлектроннойПочты);
				Профиль.ПарольSMTP = Пароль;
			КонецЕсли;
			Профиль.ИспользоватьSSLSMTP = Подключение["Encryption"] = "SSL";
			Профиль.АдресСервераSMTP = Подключение["Host"];
			Профиль.ПортSMTP = Подключение["Port"];
			Профиль.POP3ПередSMTP = Подключение["SMTPAuthentication"] = "POPBeforeSMTP";
		КонецЕсли;
		
		Если Подключение["Protocol"] = "IMAP" И Не ЗначениеЗаполнено(Профиль.АдресСервераIMAP) Тогда
			Профиль.ИспользоватьSSLIMAP = Подключение["Encryption"] = "SSL";
			Профиль.ПользовательIMAP = ?(Подключение["LoginFormat"] = "username", СтруктураАдреса.Логин, АдресЭлектроннойПочты);
			Профиль.ПарольIMAP = Пароль;
			Профиль.АдресСервераIMAP = Подключение["Host"];
			Профиль.ПортIMAP = Подключение["Port"];
		КонецЕсли;

		Если Подключение["Protocol"] = "POP3" И Не ЗначениеЗаполнено(Профиль.АдресСервераPOP3) Тогда
			Профиль.ИспользоватьSSLPOP3 = Подключение["Encryption"] = "SSL";
			Профиль.Пользователь = ?(Подключение["LoginFormat"] = "username", СтруктураАдреса.Логин, АдресЭлектроннойПочты);
			Профиль.Пароль = Пароль;
			Профиль.АдресСервераPOP3 = Подключение["Host"];
			Профиль.ПортPOP3 = Подключение["Port"];
		КонецЕсли;
	КонецЦикла;
	
	Возврат Профиль;
	
КонецФункции
	
Функция ОпределитьНастройкиPOP(АдресЭлектроннойПочты, Пароль)
	Для Каждого Профиль Из ПрофилиPOP(АдресЭлектроннойПочты, Пароль) Цикл
		СообщениеСервера = ПроверитьПодключениеКСерверуВходящейПочты(Профиль, ПротоколИнтернетПочты.POP3);
		
		Если ОшибкаАутентификации(СообщениеСервера) Тогда
			Для Каждого ИмяПользователя Из ВариантыИмениПользователя(АдресЭлектроннойПочты) Цикл
				УстановитьИмяПользователя(Профиль, ИмяПользователя);
				СообщениеСервера = ПроверитьПодключениеКСерверуВходящейПочты(Профиль, ПротоколИнтернетПочты.POP3);
				Если Не ОшибкаАутентификации(СообщениеСервера) Тогда
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если ОшибкаАутентификации(СообщениеСервера) Тогда
				Прервать;
			КонецЕсли;
		КонецЕсли;
		
		Если ПодключениеВыполнено(СообщениеСервера) Тогда
			Возврат Профиль;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
КонецФункции

Функция ОпределитьНастройкиIMAP(АдресЭлектроннойПочты, Пароль)
	Для Каждого Профиль Из ПрофилиIMAP(АдресЭлектроннойПочты, Пароль) Цикл
		СообщениеСервера = ПроверитьПодключениеКСерверуВходящейПочты(Профиль, ПротоколИнтернетПочты.IMAP);
		
		Если ОшибкаАутентификации(СообщениеСервера) Тогда
			Для Каждого ИмяПользователя Из ВариантыИмениПользователя(АдресЭлектроннойПочты) Цикл
				УстановитьИмяПользователя(Профиль, ИмяПользователя);
				СообщениеСервера = ПроверитьПодключениеКСерверуВходящейПочты(Профиль, ПротоколИнтернетПочты.IMAP);
				Если Не ОшибкаАутентификации(СообщениеСервера) Тогда
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если ОшибкаАутентификации(СообщениеСервера) Тогда
				Прервать;
			КонецЕсли;
		КонецЕсли;
		
		Если ПодключениеВыполнено(СообщениеСервера) Тогда
			Возврат Профиль;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
КонецФункции

Функция ОпределитьНастройкиSMTP(АдресЭлектроннойПочты, Пароль)
	Для Каждого Профиль Из ПрофилиSMTP(АдресЭлектроннойПочты, Пароль) Цикл
		СообщениеСервера = ПроверитьПодключениеКСерверуИсходящейПочты(Профиль, АдресЭлектроннойПочты);
		
		Если ОшибкаАутентификации(СообщениеСервера) Тогда
			Для Каждого ИмяПользователя Из ВариантыИмениПользователя(АдресЭлектроннойПочты) Цикл
				УстановитьИмяПользователя(Профиль, ИмяПользователя);
				СообщениеСервера = ПроверитьПодключениеКСерверуИсходящейПочты(Профиль, АдресЭлектроннойПочты);
				Если Не ОшибкаАутентификации(СообщениеСервера) Тогда
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если ОшибкаАутентификации(СообщениеСервера) Тогда
				Прервать;
			КонецЕсли;
		КонецЕсли;
		
		Если ПодключениеВыполнено(СообщениеСервера) Тогда
			Возврат Профиль;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
КонецФункции

Функция ПрофилиPOP(АдресЭлектроннойПочты, Пароль)
	Результат = Новый Массив;
	НастройкиПрофиля = НастройкиПоУмолчанию(АдресЭлектроннойПочты, Пароль);
	
	Для Каждого ВариантНастройкиПодключения Из ВариантыНастройкиПодключенияКСерверуPOP(АдресЭлектроннойПочты) Цикл
		Профиль = Новый ИнтернетПочтовыйПрофиль;
		ЗаполнитьЗначенияСвойств(НастройкиПрофиля, ВариантНастройкиПодключения);
		ЗаполнитьЗначенияСвойств(Профиль, ИнтернетПочтовыйПрофиль(НастройкиПрофиля, ПротоколИнтернетПочты.POP3));
		Результат.Добавить(Профиль);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

Функция ПрофилиIMAP(АдресЭлектроннойПочты, Пароль)
	Результат = Новый Массив;
	НастройкиПрофиля = НастройкиПоУмолчанию(АдресЭлектроннойПочты, Пароль);
	
	Для Каждого ВариантНастройкиПодключения Из ВариантыНастройкиПодключенияКСерверуIMAP(АдресЭлектроннойПочты) Цикл
		ЗаполнитьЗначенияСвойств(НастройкиПрофиля, ВариантНастройкиПодключения);
		Профиль = ИнтернетПочтовыйПрофиль(НастройкиПрофиля, ПротоколИнтернетПочты.IMAP);
		Результат.Добавить(Профиль);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

Функция ПрофилиSMTP(АдресЭлектроннойПочты, Пароль)
	Результат = Новый Массив;
	НастройкиПрофиля = НастройкиПоУмолчанию(АдресЭлектроннойПочты, Пароль);
	
	Для Каждого ВариантНастройкиПодключения Из ВариантыНастройкиПодключенияКСерверуSMTP(АдресЭлектроннойПочты) Цикл
		Профиль = Новый ИнтернетПочтовыйПрофиль;
		ЗаполнитьЗначенияСвойств(НастройкиПрофиля, ВариантНастройкиПодключения);
		ЗаполнитьЗначенияСвойств(Профиль, ИнтернетПочтовыйПрофиль(НастройкиПрофиля, ПротоколИнтернетПочты.SMTP));
		Результат.Добавить(Профиль);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

Функция ОшибкаАутентификации(СообщениеСервера)
	Возврат СтрНайти(НРег(СообщениеСервера), "auth") > 0
		Или СтрНайти(НРег(СообщениеСервера), "password") > 0
		Или СтрНайти(НРег(СообщениеСервера), "credentials") > 0;
КонецФункции

Функция ПодключениеВыполнено(СообщениеСервера)
	Возврат ПустаяСтрока(СообщениеСервера);
КонецФункции

Процедура УстановитьИмяПользователя(Профиль, ИмяПользователя)
	Если Не ПустаяСтрока(Профиль.Пользователь) Тогда
		Профиль.Пользователь = ИмяПользователя;
	КонецЕсли;
	Если Не ПустаяСтрока(Профиль.ПользовательIMAP) Тогда
		Профиль.ПользовательIMAP = ИмяПользователя;
	КонецЕсли;
	Если Не ПустаяСтрока(Профиль.ПользовательSMTP) Тогда
		Профиль.ПользовательSMTP = ИмяПользователя;
	КонецЕсли;
КонецПроцедуры

Функция НастройкиПоУмолчанию(АдресЭлектроннойПочты, Пароль)
	
	Позиция = СтрНайти(АдресЭлектроннойПочты, "@");
	ИмяСервераВУчетнойЗаписи = Сред(АдресЭлектроннойПочты, Позиция + 1);
	
	Настройки = Новый Структура;
	
	Настройки.Вставить("ИмяПользователяДляПолученияПисем", АдресЭлектроннойПочты);
	Настройки.Вставить("ИмяПользователяДляОтправкиПисем", АдресЭлектроннойПочты);
	
	Настройки.Вставить("ПарольДляОтправкиПисем", Пароль);
	Настройки.Вставить("ПарольДляПолученияПисем", Пароль);
	
	Настройки.Вставить("Протокол", "POP");
	Настройки.Вставить("СерверВходящейПочты", "pop." + ИмяСервераВУчетнойЗаписи);
	Настройки.Вставить("ПортСервераВходящейПочты", 995);
	Настройки.Вставить("ИспользоватьЗащищенноеСоединениеДляВходящейПочты", Истина);
	
	Настройки.Вставить("СерверИсходящейПочты", "smtp." + ИмяСервераВУчетнойЗаписи);
	Настройки.Вставить("ПортСервераИсходящейПочты", 465);
	Настройки.Вставить("ИспользоватьЗащищенноеСоединениеДляИсходящейПочты", Истина);
	Настройки.Вставить("ТребуетсяВходНаСерверПередОтправкой", Ложь);
	
	Настройки.Вставить("ДлительностьОжиданияСервера", 30);
	Настройки.Вставить("ОставлятьКопииПисемНаСервере", Истина);
	Настройки.Вставить("УдалятьПисьмаССервераЧерез", 0);
	
	Возврат Настройки;
	
КонецФункции

Функция ПроверитьПодключениеКСерверуВходящейПочты(Профиль, Протокол)
	
	ИнтернетПочта = Новый ИнтернетПочта;
	
	ТекстОшибки = "";
	Попытка
		ИнтернетПочта.Подключиться(Профиль, Протокол);
	Исключение
		ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	
	ИнтернетПочта.Отключиться();
	
	Если Протокол = ПротоколИнтернетПочты.POP3 Тогда
		ТекстДляЖурнала = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1:%2%3 (%4)" + Символы.ПС + "%5",
			Профиль.АдресСервераPOP3,
			Профиль.ПортPOP3,
			?(Профиль.ИспользоватьSSLPOP3, "/SSL", ""),
			Профиль.Пользователь,
			?(ПустаяСтрока(ТекстОшибки), НСтр("ru = 'OK'"), ТекстОшибки));
	Иначе
		ТекстДляЖурнала = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1:%2%3 (%4)" + Символы.ПС + "%5",
			Профиль.АдресСервераIMAP,
			Профиль.ПортIMAP,
			?(Профиль.ИспользоватьSSLIMAP, "/SSL", ""),
			Профиль.ПользовательIMAP,
			?(ПустаяСтрока(ТекстОшибки), НСтр("ru = 'OK'"), ТекстОшибки));
	КонецЕсли;
	
	ЗаписьЖурналаРегистрации(СобытиеПроверкаПодключенияКПочтовомуСерверу(), 
		УровеньЖурналаРегистрации.Информация, , , ТекстДляЖурнала);
	
	Возврат ТекстОшибки;
	
КонецФункции

Функция ПроверитьПодключениеКСерверуИсходящейПочты(Профиль, АдресЭлектроннойПочты)
	
	Тема = НСтр("ru = 'Тестовое сообщение 1С:Предприятие'");
	Тело = НСтр("ru = 'Это сообщение отправлено подсистемой электронной почты 1С:Предприятие'");
	ИмяОтправителяПисем = НСтр("ru = '1С:Предприятие'");
	
	Письмо = Новый ИнтернетПочтовоеСообщение;
	Письмо.Тема = Тема;
	
	Получатель = Письмо.Получатели.Добавить(АдресЭлектроннойПочты);
	Получатель.ОтображаемоеИмя = ИмяОтправителяПисем;
	
	Письмо.ИмяОтправителя = ИмяОтправителяПисем;
	Письмо.Отправитель.ОтображаемоеИмя = ИмяОтправителяПисем;
	Письмо.Отправитель.Адрес = АдресЭлектроннойПочты;
	
	Текст = Письмо.Тексты.Добавить(Тело);
	Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;

	ИнтернетПочта = Новый ИнтернетПочта;
	
	ТекстОшибки = "";
	Попытка
		ИнтернетПочта.Подключиться(Профиль);
		ИнтернетПочта.Послать(Письмо);
	Исключение
		ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	
	ИнтернетПочта.Отключиться();
	
	ТекстДляЖурнала = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1:%2%3 (%4)" + Символы.ПС + "%5",
		Профиль.АдресСервераSMTP,
		Профиль.ПортSMTP,
		?(Профиль.ИспользоватьSSLSMTP, "/SSL", ""),
		Профиль.ПользовательSMTP,
		?(ПустаяСтрока(ТекстОшибки), НСтр("ru = 'OK'"), ТекстОшибки));
		
	ЗаписьЖурналаРегистрации(СобытиеПроверкаПодключенияКПочтовомуСерверу(), 
		УровеньЖурналаРегистрации.Информация, , , ТекстДляЖурнала);
	
	Возврат ТекстОшибки;
	
КонецФункции

Функция ИнтернетПочтовыйПрофиль(НастройкиПрофиля, Протокол)
	
	ДляПолучения = Протокол <> ПротоколИнтернетПочты.SMTP;
	
	Профиль = Новый ИнтернетПочтовыйПрофиль;
	Если ДляПолучения Или НастройкиПрофиля.ТребуетсяВходНаСерверПередОтправкой Тогда
		Если Протокол = ПротоколИнтернетПочты.IMAP Тогда
			Профиль.АдресСервераIMAP = НастройкиПрофиля.СерверВходящейПочты;
			Профиль.ИспользоватьSSLIMAP = НастройкиПрофиля.ИспользоватьЗащищенноеСоединениеДляВходящейПочты;
			Профиль.ПарольIMAP = НастройкиПрофиля.ПарольДляПолученияПисем;
			Профиль.ПользовательIMAP = НастройкиПрофиля.ИмяПользователяДляПолученияПисем;
			Профиль.ПортIMAP = НастройкиПрофиля.ПортСервераВходящейПочты;
		Иначе
			Профиль.АдресСервераPOP3 = НастройкиПрофиля.СерверВходящейПочты;
			Профиль.ИспользоватьSSLPOP3 = НастройкиПрофиля.ИспользоватьЗащищенноеСоединениеДляВходящейПочты;
			Профиль.Пароль = НастройкиПрофиля.ПарольДляПолученияПисем;
			Профиль.Пользователь = НастройкиПрофиля.ИмяПользователяДляПолученияПисем;
			Профиль.ПортPOP3 = НастройкиПрофиля.ПортСервераВходящейПочты;
		КонецЕсли;
	КонецЕсли;
	
	Если Не ДляПолучения Тогда
		Профиль.POP3ПередSMTP = НастройкиПрофиля.ТребуетсяВходНаСерверПередОтправкой;
		Профиль.АдресСервераSMTP = НастройкиПрофиля.СерверИсходящейПочты;
		Профиль.ИспользоватьSSLSMTP = НастройкиПрофиля.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты;
		Профиль.ПарольSMTP = НастройкиПрофиля.ПарольДляОтправкиПисем;
		Профиль.ПользовательSMTP = НастройкиПрофиля.ИмяПользователяДляОтправкиПисем;
		Профиль.ПортSMTP = НастройкиПрофиля.ПортСервераИсходящейПочты;
	КонецЕсли;
	
	Профиль.Таймаут = НастройкиПрофиля.ДлительностьОжиданияСервера;
	
	Возврат Профиль;
	
КонецФункции

Функция ВариантыИмениПользователя(АдресЭлектроннойПочты)
	
	Позиция = СтрНайти(АдресЭлектроннойПочты, "@");
	ИмяПользователяВУчетнойЗаписи = Лев(АдресЭлектроннойПочты, Позиция - 1);
	
	Результат = Новый Массив;
	Результат.Добавить(ИмяПользователяВУчетнойЗаписи);
	
	Возврат Результат;
	
КонецФункции

Функция ВариантыНастройкиПодключенияКСерверуIMAP(АдресЭлектроннойПочты) Экспорт
	
	Позиция = СтрНайти(АдресЭлектроннойПочты, "@");
	ИмяСервераВУчетнойЗаписи = Сред(АдресЭлектроннойПочты, Позиция + 1);
	
	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("СерверВходящейПочты");
	Результат.Колонки.Добавить("ПортСервераВходящейПочты");
	Результат.Колонки.Добавить("ИспользоватьЗащищенноеСоединениеДляВходящейПочты");
	
	// icloud.com
	Если ИмяСервераВУчетнойЗаписи = "icloud.com" Тогда
		ВариантНастройки = Результат.Добавить();
		ВариантНастройки.СерверВходящейПочты = "imap.mail.me.com";
		ВариантНастройки.ПортСервераВходящейПочты = 993;
		ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
		Возврат Результат;
	КонецЕсли;
	
	// outlook.com
	Если ИмяСервераВУчетнойЗаписи = "outlook.com" Тогда
		ВариантНастройки = Результат.Добавить();
		ВариантНастройки.СерверВходящейПочты = "outlook.office365.com";
		ВариантНастройки.ПортСервераВходящейПочты = 993;
		ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
		Возврат Результат;
	КонецЕсли;

	// Стандартные настройки, подходящие для ящиков gmail, yandex и mail.ru
	// имя сервера с префиксом "imap.", защищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "imap." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 993;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
	
	// Имя сервера с префиксом "mail.", защищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 993;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
	
	// Имя сервера без префикса "imap.", защищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 993;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
	
	// Имя сервера с префиксом "imap.", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "imap." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 143;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Ложь;
	
	// Имя сервера с префиксом "mail.", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 143;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Ложь;
	
	// Имя сервера без префикса "imap.", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 143;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Ложь;
	
	Возврат Результат;
	
КонецФункции

Функция ВариантыНастройкиПодключенияКСерверуPOP(АдресЭлектроннойПочты)
	
	Позиция = СтрНайти(АдресЭлектроннойПочты, "@");
	ИмяСервераВУчетнойЗаписи = Сред(АдресЭлектроннойПочты, Позиция + 1);
	
	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("СерверВходящейПочты");
	Результат.Колонки.Добавить("ПортСервераВходящейПочты");
	Результат.Колонки.Добавить("ИспользоватьЗащищенноеСоединениеДляВходящейПочты");
	
	// Стандартные настройки, подходящие для ящиков  gmail, yandex и mail.ru
	// имя сервера с префиксом "pop.", защищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "pop." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 995;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
	
	// Имя сервера с префиксом "pop3.", защищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "pop3." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 995;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
	
	// Имя сервера с префиксом "mail.", защищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 995;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
	
	// Имя сервера без префиксов, защищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 995;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Истина;
	
	// Имя сервера с префиксом "pop.", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "pop." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 110;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Ложь;
	
	// Имя сервера с префиксом "pop3", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "pop3." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 110;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Ложь;
	
	// Имя сервера с префиксом "mail.", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 110;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Ложь;
	
	// Имя сервера без префиксов, незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверВходящейПочты = ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераВходящейПочты = 110;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляВходящейПочты = Ложь;
	
	Возврат Результат;
	
КонецФункции

Функция ВариантыНастройкиПодключенияКСерверуSMTP(АдресЭлектроннойПочты) Экспорт
	
	Позиция = СтрНайти(АдресЭлектроннойПочты, "@");
	ИмяСервераВУчетнойЗаписи = Сред(АдресЭлектроннойПочты, Позиция + 1);
	
	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("СерверИсходящейПочты");
	Результат.Колонки.Добавить("ПортСервераИсходящейПочты");
	Результат.Колонки.Добавить("ИспользоватьЗащищенноеСоединениеДляИсходящейПочты");
	
	// icloud.com
	Если ИмяСервераВУчетнойЗаписи = "icloud.com" Тогда
		ВариантНастройки = Результат.Добавить();
		ВариантНастройки.СерверИсходящейПочты = "smtp.mail.me.com";
		ВариантНастройки.ПортСервераИсходящейПочты = 587;
		ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
		Возврат Результат;
	КонецЕсли;
	
	// outlook.com
	Если ИмяСервераВУчетнойЗаписи = "outlook.com" Тогда
		ВариантНастройки = Результат.Добавить();
		ВариантНастройки.СерверИсходящейПочты = "smtp-mail.outlook.com";
		ВариантНастройки.ПортСервераИсходящейПочты = 587;
		ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
		Возврат Результат;
	КонецЕсли;
	
	// Стандартные настройки, подходящие для ящиков gmail, yandex и mail.ru
	// имя сервера с префиксом "smtp.", защищенное соединение, порт 465.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = "smtp." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 465;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Истина;
	
	// Имя сервера с префиксом "mail.", защищенное соединение, порт 465.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 465;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Истина;
	
	// Имя сервера без префиксов, защищенное соединение, порт 465.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 465;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Истина;
	
	// Имя сервера с префиксом "smtp.", защищенное (STARTTLS) соединение, порт 587.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = "smtp." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 587;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
	
	// Имя сервера с префиксом "mail.", защищенное (STARTTLS) соединение, порт 587.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 587;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
	
	// Имя сервера без префиксов, защищенное (STARTTLS) соединение, порт 587.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 587;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
	
	// Имя сервера с префиксом "smtp.", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = "smtp." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 25;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
	
	// Имя сервера с префиксом "mail.", незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 25;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
	
	// Имя сервера без префиксов, незащищенное соединение.
	ВариантНастройки = Результат.Добавить();
	ВариантНастройки.СерверИсходящейПочты = ИмяСервераВУчетнойЗаписи;
	ВариантНастройки.ПортСервераИсходящейПочты = 25;
	ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
	
	Возврат Результат;
	
КонецФункции

Функция РеквизитыТребующиеВводаПароляДляИзменения() Экспорт
	
	Возврат "ИспользоватьДляОтправки,ИспользоватьДляПолучения,СерверВходящейПочты,СерверИсходящейПочты,ВладелецУчетнойЗаписи,ИспользоватьЗащищенноеСоединениеДляВходящейПочты,ИспользоватьЗащищенноеСоединениеДляИсходящейПочты,Пользователь,ПользовательSMTP";
	
КонецФункции

Функция ТребуетсяПроверкаПароля(Ссылка, ЗначенияРеквизитовПередЗаписью) Экспорт
	
	Если Ссылка.Пустая() Тогда
		Возврат Ложь;
	КонецЕсли;
	
	СписокРеквизитов = РеквизитыТребующиеВводаПароляДляИзменения();
	ЗаписанныеЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, СписокРеквизитов);
	
	Результат = ЗначениеЗаполнено(ЗаписанныеЗначенияРеквизитов.ВладелецУчетнойЗаписи);
	Если Результат Тогда
		ДоИзменения = Новый Структура(СписокРеквизитов);
		ЗаполнитьЗначенияСвойств(ДоИзменения, ЗаписанныеЗначенияРеквизитов);
		ПослеИзменения = Новый Структура(СписокРеквизитов);
		ЗаполнитьЗначенияСвойств(ПослеИзменения, ЗначенияРеквизитовПередЗаписью);
		Результат = ОбщегоНазначения.ЗначениеВСтрокуXML(ДоИзменения) <> ОбщегоНазначения.ЗначениеВСтрокуXML(ПослеИзменения);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ПроверитьВозможностьПодключенияКПочтовомуСерверу(Знач УчетнаяЗапись, Знач ВходящаяПочта) Экспорт
	
	УстановитьОтключениеБезопасногоРежима(Истина);
	Профиль = РаботаСПочтовымиСообщениямиСлужебный.ИнтернетПочтовыйПрофиль(УчетнаяЗапись, ВходящаяПочта);
	
	Если ВходящаяПочта Тогда
		Протокол = ПротоколИнтернетПочты.POP3;
		Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УчетнаяЗапись, "ПротоколВходящейПочты") = "IMAP" Тогда
			Протокол = ПротоколИнтернетПочты.IMAP;
		КонецЕсли;
		ТекстОшибки = ПроверитьПодключениеКСерверуВходящейПочты(Профиль, Протокол);
	Иначе 
		Адрес = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УчетнаяЗапись, "АдресЭлектроннойПочты");
		ТекстОшибки = ПроверитьПодключениеКСерверуИсходящейПочты(Профиль, Адрес);
	КонецЕсли;
	
	Возврат ТекстОшибки;
	
КонецФункции

Функция ПроверитьНастройкиУчетнойЗаписи(УчетнаяЗапись) Экспорт
	
	НастройкиУчетнойЗаписи = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись,
		"ИспользоватьДляОтправки,ИспользоватьДляПолучения,АдресЭлектроннойПочты");
	
	ПрофильИсходящейПочты = Неопределено;
	ПрофильВходящейПочты = Неопределено;

	УстановитьОтключениеБезопасногоРежима(Истина);
	Если НастройкиУчетнойЗаписи.ИспользоватьДляОтправки Тогда
		ПрофильИсходящейПочты = РаботаСПочтовымиСообщениямиСлужебный.ИнтернетПочтовыйПрофиль(УчетнаяЗапись, Ложь);
	КонецЕсли;
	Если НастройкиУчетнойЗаписи.ИспользоватьДляПолучения Тогда
		ПрофильВходящейПочты = РаботаСПочтовымиСообщениямиСлужебный.ИнтернетПочтовыйПрофиль(УчетнаяЗапись, Истина);
	КонецЕсли;
	УстановитьОтключениеБезопасногоРежима(Ложь);
	
	АдресЭлектроннойПочты = РаботаСПочтовымиСообщениямиСлужебный.СтрокаВPunycode(НастройкиУчетнойЗаписи.АдресЭлектроннойПочты);
	
	Возврат ПроверитьНастройкиПрофилей(ПрофильИсходящейПочты, ПрофильВходящейПочты, АдресЭлектроннойПочты);
	
КонецФункции

Функция ПроверитьНастройкиПрофилей(ПрофильИсходящейПочты, ПрофильВходящейПочты, Знач АдресЭлектроннойПочты) Экспорт
	
	АдресЭлектроннойПочты = РаботаСПочтовымиСообщениямиСлужебный.СтрокаВPunycode(АдресЭлектроннойПочты);
	ТекстСообщения = Новый Массив;
	ТехническиеПодробности = Новый Массив;
	ВыполненныеПроверки = Новый Массив;
	
	ОшибкаАутентификации = Ложь;
	ТребуетсяПроверкаНастроекИсходящейПочты = Ложь;
	ТребуетсяПроверкаНастроекВходящейПочты = Ложь;
	
	ТекстыОшибок = Новый Массив;
	
	Если ПрофильИсходящейПочты <> Неопределено Тогда
		ТекстОшибки = ПроверитьПодключениеКСерверуИсходящейПочты(ПрофильИсходящейПочты, АдресЭлектроннойПочты);
		Если ЗначениеЗаполнено(ТекстОшибки) Тогда
			ТекстыОшибок.Добавить(ТекстОшибки);
			ТехническиеПодробности.Добавить(ТекстОшибки);
			
			ОшибкаАутентификации = ОшибкаАутентификации(ТекстОшибки);
			Если ОшибкаАутентификации(ТекстОшибки) Тогда
				ТекстСообщения.Добавить(НСтр("ru = 'Отправка тестового сообщения не выполнена: не удалось авторизоваться.'"));
			Иначе
				ТекстСообщения.Добавить(НСтр("ru = 'Отправка тестового сообщения не выполнена.'"));
				ТребуетсяПроверкаНастроекИсходящейПочты = Истина;
				
				Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
					МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
					ДиагностикаСоединения = МодульПолучениеФайловИзИнтернета.ДиагностикаСоединения(ПрофильИсходящейПочты.АдресСервераSMTP);
					ТехническиеПодробности.Добавить(ДиагностикаСоединения.ЖурналДиагностики);
				КонецЕсли;
			КонецЕсли;
		Иначе
			ВыполненныеПроверки.Добавить("- " + НСтр("ru = 'Выполнена отправка тестового сообщения.'"));
		КонецЕсли;
		
	КонецЕсли;
	
	Если ПрофильВходящейПочты <> Неопределено Тогда
		Протокол = ?(ЗначениеЗаполнено(ПрофильВходящейПочты.АдресСервераIMAP), ПротоколИнтернетПочты.IMAP, ПротоколИнтернетПочты.POP3);
		ТекстОшибки = ПроверитьПодключениеКСерверуВходящейПочты(ПрофильВходящейПочты, Протокол);
		Если ЗначениеЗаполнено(ТекстОшибки) Тогда
			ТекстыОшибок.Добавить(ТекстОшибки);
			ТехническиеПодробности.Добавить(ТекстОшибки);
			
			ОшибкаАутентификации = ОшибкаАутентификации(ТекстОшибки);
			Если ОшибкаАутентификации(ТекстОшибки) Тогда
				ТекстСообщения.Добавить(НСтр("ru = 'Подключение к серверу входящей почты не выполнено: не удалось авторизоваться.'"));
			Иначе
				ТекстСообщения.Добавить(НСтр("ru = 'Подключение к серверу входящей почты не выполнено.'"));
				ТребуетсяПроверкаНастроекВходящейПочты = Истина;
				
				Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
					МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
					СерверВходящейПочты = ?(Протокол = ПротоколИнтернетПочты.IMAP, ПрофильВходящейПочты.АдресСервераIMAP, ПрофильВходящейПочты.АдресСервераPOP3);
					ДиагностикаСоединения = МодульПолучениеФайловИзИнтернета.ДиагностикаСоединения(СерверВходящейПочты);
					ТехническиеПодробности.Добавить(ДиагностикаСоединения.ЖурналДиагностики);
				КонецЕсли;
			КонецЕсли;
		Иначе
			ВыполненныеПроверки.Добавить("- " + НСтр("ru = 'Выполнено подключение к серверу входящей почты.'"));
		КонецЕсли;
		
	КонецЕсли;
	
	ТехническиеПодробности.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Адрес почты: %1'"), АдресЭлектроннойПочты));
	
	ТехническиеПодробности.Добавить(ОписаниеНастроек(ПрофильИсходящейПочты, ПрофильВходящейПочты));
	
	ТехническиеПодробности.Добавить(ИнформацияОПрограмме());
	
	ОшибкиПодключения = "";
	
	Если ЗначениеЗаполнено(ТекстСообщения) Тогда
		ЧастиАдреса = СтрРазделить(АдресЭлектроннойПочты, "@", Истина);
		ДоменноеИмя = ЧастиАдреса[ЧастиАдреса.ВГраница()];
		ТекстСообщения = СтрСоединить(ТекстСообщения, Символы.ПС);
		
		ТехническиеПодробности = СтрСоединить(ТехническиеПодробности, Символы.ПС + Символы.ПС);
		
		Рекомендации = Новый Массив;
		Если ОшибкаАутентификации Тогда
			Рекомендации.Добавить(НСтр("ru = 'Проверьте правильность ввода логина и пароля, а также выбранный способ авторизации.'"));
		КонецЕсли;
		Если ТребуетсяПроверкаНастроекИсходящейПочты Тогда
			Рекомендации.Добавить(НСтр("ru = 'Проверьте настройки подключения к серверу исходящей почты.'"));
		КонецЕсли;
		Если ТребуетсяПроверкаНастроекВходящейПочты Тогда
			Рекомендации.Добавить(НСтр("ru = 'Проверьте настройки подключения к серверу входящей почты.'"));
		КонецЕсли;
		Если ТребуетсяПроверкаНастроекИсходящейПочты Или ТребуетсяПроверкаНастроекВходящейПочты Тогда
			Рекомендации.Добавить(НСтр("ru = 'Обратитесь к администратору локальной сети.'"));
		КонецЕсли;
		
		Рекомендации = СтрСоединить(Рекомендации, Символы.ПС);
		
		ОшибкиПодключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1
			|
			|%2
			|
			|Обратитесь к администратору почтового сервера ""%3"".
			|
			|============================
			|
			|Информация для техподдержки:
			|
			|%4'"), ТекстСообщения, Рекомендации, ДоменноеИмя, ТехническиеПодробности);
	КонецЕсли;
	
	ВыполненныеПроверки = СтрСоединить(ВыполненныеПроверки, Символы.ПС);
	
	Если ЗначениеЗаполнено(ОшибкиПодключения) Тогда
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка настроек почты'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Предупреждение, , , ОшибкиПодключения);
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("ВыполненныеПроверки", ВыполненныеПроверки);
	Результат.Вставить("ОшибкиПодключения", ОшибкиПодключения);
	Результат.Вставить("ТекстыОшибок", ТекстыОшибок);
	
	Возврат Результат;
	
КонецФункции

Функция ОписаниеНастроек(ПрофильИсходящейПочты, ПрофильВходящейПочты)
	
	ОписаниеНастроек = Новый Массив;
	
	СписокСвойствIMAP = "АдресСервераIMAP,ПортIMAP,ИспользоватьSSLIMAP,ПользовательIMAP";
	СписокСвойствPOP3 = "АдресСервераPOP3,ПортPOP3,ИспользоватьSSLPOP3,Пользователь";
	СписокСвойствSMTP = "АдресСервераSMTP,ПортSMTP,ИспользоватьSSLSMTP,ПользовательSMTP,POP3ПередSMTP";
	
	Профиль = Новый ИнтернетПочтовыйПрофиль();
	Если ПрофильВходящейПочты <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(Профиль, ПрофильВходящейПочты);
		Профиль.ПортIMAP = ПрофильВходящейПочты.ПортIMAP;
	КонецЕсли;
	
	Если ПрофильИсходящейПочты <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(Профиль, ПрофильИсходящейПочты, , СписокСвойствPOP3);
		Профиль.ПортIMAP = ПрофильИсходящейПочты.ПортIMAP;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Профиль.АдресСервераSMTP) Тогда
		Настройки = Новый Массив;
		Для Каждого ИмяСвойства Из СтрРазделить(СписокСвойствSMTP, ",", Ложь) Цикл
			Настройки.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1=""%2""'"), ИмяСвойства, Профиль[ИмяСвойства]));
		КонецЦикла;
		ОписаниеНастроек.Добавить(СтрСоединить(Настройки, ", "));
	КонецЕсли;

	Если ЗначениеЗаполнено(Профиль.АдресСервераIMAP) Тогда
		Настройки = Новый Массив;
		Для Каждого ИмяСвойства Из СтрРазделить(СписокСвойствIMAP, ",", Ложь) Цикл
			Настройки.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1=""%2""'"), ИмяСвойства, Профиль[ИмяСвойства]));
		КонецЦикла;
		ОписаниеНастроек.Добавить(СтрСоединить(Настройки, ", "));
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Профиль.АдресСервераPOP3) Тогда
		Настройки = Новый Массив;
		Для Каждого ИмяСвойства Из СтрРазделить(СписокСвойствPOP3, ",", Ложь) Цикл
			Настройки.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1=""%2""'"), ИмяСвойства, Профиль[ИмяСвойства]));
		КонецЦикла;
		ОписаниеНастроек.Добавить(СтрСоединить(Настройки, ", "));
	КонецЕсли;	
	
	Возврат СтрСоединить(ОписаниеНастроек, Символы.ПС);
	
КонецФункции

Функция ИнформацияОПрограмме()
	
	СистемнаяИнформация = Новый СистемнаяИнформация;
	
	Результат = Новый Массив;
	Результат.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Операционная система: %1'"), СистемнаяИнформация.ВерсияОС));
	Результат.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Платформа: %1 (%2)'"),
		СистемнаяИнформация.ВерсияПриложения, СистемнаяИнформация.ТипПлатформы));
	Результат.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Конфигурация: %1 (%2)'"), 
		?(ЗначениеЗаполнено(Метаданные.Синоним), Метаданные.Синоним, Метаданные.Имя), Метаданные.Версия));
		
	Результат.Добавить(Символы.ПС + НСтр("ru = 'Расширения:'"));
	
	УстановитьПривилегированныйРежим(Истина);
	Для Каждого Расширение Из РасширенияКонфигурации.Получить() Цикл
		Если Расширение.Активно Тогда
			Результат.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (%2)'"),
				?(ЗначениеЗаполнено(Расширение.Синоним), Расширение.Синоним, Расширение.Имя), Расширение.Версия));
		КонецЕсли;
	КонецЦикла;
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат СтрСоединить(Результат, Символы.ПС);
	
КонецФункции

Функция СобытиеПроверкаПодключенияКПочтовомуСерверу()
	Возврат НСтр("ru = 'Проверка подключения к почтовому серверу'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецФункции

#КонецОбласти

#КонецЕсли